package basis

import "fmt"

func init()  {
	fmt.Printf("porcess init\n")
}
func Process() {
	i := 0
Here: //这行的第一个词，以冒号结束作为标签
	fmt.Println(i)
	i++
	if i == 10 {
		goto There
	}
	goto Here //跳转到Here去

There:
	sum := 0;
	for index := 0; index < 10; index++ {
		sum += index
	}
	fmt.Println("sum is equal to ", sum)

	for index := 10; index > 0; index-- {
		if index == 5 {
			break // 或者continue
		}
		fmt.Println(index)
	}

	rating := map[string]float32{"C": 5, "Go": 4.5, "Python": 4.5, "C++": 2 }

	for k, v := range rating {
		fmt.Println("map's key:", k)
		fmt.Println("map's val:", v)
	}

	fmt.Printf("max:= %d\n",max(10,11))

	x := 3
	y := 4

	xPLUSy, xTIMESy := sumAndProduct(x, y)

	fmt.Printf("%d + %d = %d\n", x, y, xPLUSy)
	fmt.Printf("%d * %d = %d\n", x, y, xTIMESy)

	myfunc(1,2,3,4,5,6,7,8,9,0)

	x0 := 3

	fmt.Println("x0 = ", x0)  // 应该输出 "x = 3"

	x1 := add2(&x0)  //调用add1(x)

	fmt.Println("x+1 = ", x1) // 应该输出"x+1 = 4"
	fmt.Println("x0 = ", x0)    // 应该输出"x = 3"

	for i := 0; i < 5; i++ {
		defer fmt.Printf("%d ", i)
	}

	slice := []int {1, 2, 3, 4, 5, 7}
	fmt.Println("slice = ", slice)
	odd := filter(slice, isOdd)    // 函数当做值来传递了
	fmt.Println("Odd elements of slice are: ", odd)
	even := filter(slice, isEven)  // 函数当做值来传递了
	fmt.Println("Even elements of slice are: ", even)
}

// 返回a、b中最大值.
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func sumAndProduct(A, B int) (int, int) {
	return A+B, A*B
}

func myfunc(arg ...int) {
	for _, n := range arg {
		fmt.Printf("And the number is: %d\n", n)
	}
}

//简单的一个函数，实现了参数+1的操作
func add1(a int) int {
	a = a+1 // 我们改变了a的值
	return a //返回一个新值
}

//简单的一个函数，实现了参数+1的操作
func add2(a *int) int { // 请注意，
	*a = *a+1 // 修改了a的值
	return *a // 返回新值
}

//filter函数的参数和返回值与testInt类型是一样的
type testInt func(int) bool // 声明了一个函数类型

func isOdd(integer int) bool {
	if integer%2 == 0 {
		return false
	}
	return true
}

func isEven(integer int) bool {
	if integer%2 == 0 {
		return true
	}
	return false
}

// 声明的函数类型在这个地方当做了一个参数

func filter(slice []int, f testInt) []int {
	var result []int
	for _, value := range slice {
		if f(value) {
			result = append(result, value)
		}
	}
	return result
}